#-*- coding=utf8 -*-
#使用gensim训练word2v

import gensim
from gensim import models
from gensim.models import word2vec
sentences=word2vec.Text8Corpus("./dataset/segment.txt")

#该步骤也可分解为以下三步：
#model=gensim.model.Word2Vec() 建立一个空的模型对象
#model.build_vocab(sentences) 遍历一次语料库建立词典
#model.train(sentences) 第二次遍历语料库建立神经网络模型

#sg=1是skip—gram算法，对低频词敏感，默认sg=0为CBOW算法
#size是神经网络层数，值太大则会耗内存并使算法计算变慢，一般值取为100到200之间。
#window是句子中当前词与目标词之间的最大距离，3表示在目标词前看3-b个词，后面看b个词（b在0-3之间随机）
#min_count是对词进行过滤，频率小于min-count的单词则会被忽视，默认值为5。
#negative和sample可根据训练结果进行微调，sample表示更高频率的词被随机下采样到所设置的阈值，默认值为1e-3,
#negative: 如果>0,则会采用negativesamping，用于设置多少个noise words
#hs=1表示层级softmax将会被使用，默认hs=0且negative不为0，则负采样将会被选择使用。
#workers是线程数，此参数只有在安装了Cpython后才有效，否则只能使用单核
###################################################
#重要参数
# min_count，是去除小于min_count的单词
# size，神经网络层数
# sg， 算法选择
# window， 句子中当前词与目标词之间的最大距离
# workers，线程数
model_path=".\dataset\model.bin"
def train_model():
    # 重要参数
    # min_count，是去除小于min_count的单词
    # size，神经网络层数
    # sg， 算法选择
    # window， 句子中当前词与目标词之间的最大距离
    # workers，线程数
    model = gensim.models.Word2Vec(sentences, sg=1, size=100, window=5, min_count=2, negative=3, sample=0.001, hs=1,
                                   workers=4)
    # 通过该方式保存的模型，能通过文本格式打开，也能通过设置binary是否保存为二进制文件。但该模型在保存时丢弃了树的保存形式
    # （详情参加word2vec构建过程，以类似哈夫曼树的形式保存词），所以在后续不能对模型进行追加训练
    model.wv.save_word2vec_format(model_path, binary=True)

def find_most_similar(word,n):
    model = models.KeyedVectors.load_word2vec_format(model_path, binary=True)
    similar_word=model.most_similar("工具",topn=3)
    print(similar_word)
    return similar_word

if __name__ == '__main__':
    find_most_similar("工具",3)